除了我們在前幾節描述的伺服器端快取之外,Web 應用程式也可以利用用戶端快取,以節省產生和傳輸相同頁面內容的時間。
若要使用用戶端快取,您可以將 yii\filters\HttpCache 配置為控制器動作的篩選器,其呈現結果可能會在用戶端快取。HttpCache 僅適用於 GET
和 HEAD
請求。它可以處理這些請求的三種快取相關 HTTP 標頭
Last-Modified
標頭 ¶Last-Modified
標頭使用時間戳記來指示頁面自用戶端快取以來是否已修改。
您可以配置 yii\filters\HttpCache::$lastModified 屬性以啟用發送 Last-Modified
標頭。該屬性應為 PHP 可調用物件,返回有關頁面修改時間的 UNIX 時間戳記。PHP 可調用物件的簽名應如下所示:
/**
* @param Action $action the action object that is being handled currently
* @param array $params the value of the "params" property
* @return int a UNIX timestamp representing the page modification time
*/
function ($action, $params)
以下是利用 Last-Modified
標頭的範例
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('post')->max('updated_at');
},
],
];
}
上面的程式碼表示應僅對 index
動作啟用 HTTP 快取。它應根據貼文的上次更新時間生成 Last-Modified
HTTP 標頭。當瀏覽器首次訪問 index
頁面時,將在伺服器上生成該頁面並發送到瀏覽器;如果瀏覽器再次訪問同一頁面,並且在此期間沒有貼文被修改,則伺服器將不會重新生成該頁面,並且瀏覽器將使用用戶端上的快取版本。因此,伺服器端呈現和頁面內容傳輸都被跳過。
ETag
標頭 ¶“實體標籤”(或簡稱 ETag
)標頭使用雜湊值來表示頁面的內容。如果頁面已更改,則雜湊值也將更改。通過將保留在用戶端上的雜湊值與在伺服器端生成的雜湊值進行比較,快取可以確定頁面是否已更改,以及是否應重新傳輸。
您可以配置 yii\filters\HttpCache::$etagSeed 屬性以啟用發送 ETag
標頭。該屬性應為 PHP 可調用物件,返回用於生成 ETag 雜湊值的種子。PHP 可調用物件的簽名應如下所示:
/**
* @param Action $action the action object that is being handled currently
* @param array $params the value of the "params" property
* @return string a string used as the seed for generating an ETag hash
*/
function ($action, $params)
以下是利用 ETag
標頭的範例
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['view'],
'etagSeed' => function ($action, $params) {
$post = $this->findModel(\Yii::$app->request->get('id'));
return serialize([$post->title, $post->content]);
},
],
];
}
上面的程式碼表示應僅對 view
動作啟用 HTTP 快取。它應根據請求貼文的標題和內容生成 ETag
HTTP 標頭。當瀏覽器首次訪問 view
頁面時,將在伺服器上生成該頁面並發送到瀏覽器;如果瀏覽器再次訪問同一頁面,並且貼文的標題和內容沒有更改,則伺服器將不會重新生成該頁面,並且瀏覽器將使用用戶端上的快取版本。因此,伺服器端呈現和頁面內容傳輸都被跳過。
與 Last-Modified
標頭相比,ETag 允許更複雜和/或更精確的快取策略。例如,如果網站已切換到另一個主題,則 ETag 可以失效。
昂貴的 ETag 生成可能會適得其反,因為它們需要在每個請求上重新評估,並引入不必要的開銷。嘗試找到一個簡單的表達式,如果頁面內容已修改,則該表達式會使快取失效。
注意: 為了符合 RFC 7232,如果同時配置了
ETag
和Last-Modified
標頭,HttpCache
將同時發送這兩個標頭。並且如果用戶端同時發送If-None-Match
標頭和If-Modified-Since
標頭,則只會尊重前者。
Cache-Control
標頭 ¶Cache-Control
標頭指定頁面的一般快取策略。您可以通過使用標頭值配置 yii\filters\HttpCache::$cacheControlHeader 屬性來發送它。預設情況下,將發送以下標頭
Cache-Control: public, max-age=3600
當頁面使用 session 時,PHP 將自動發送一些快取相關的 HTTP 標頭,如 session.cache_limiter
PHP INI 設定中所指定。這些標頭可能會干擾或禁用您希望從 HttpCache
獲得的快取。為了防止這個問題,預設情況下 HttpCache
將自動禁用發送這些標頭。如果您想更改此行為,則應配置 yii\filters\HttpCache::$sessionCacheLimiter 屬性。該屬性可以採用字串值,包括 public
、private
、private_no_expire
和 nocache
。請參閱 PHP 手冊中關於 session_cache_limiter() 這些值的說明。
搜尋引擎機器人傾向於尊重快取標頭。由於某些爬蟲程式對每個網域在一定時間跨度內處理的頁面數量有限制,因此引入快取標頭可能有助於索引您的網站,因為它們減少了需要處理的頁面數量。
發現錯字或您認為此頁面需要改進嗎?
在 github 上編輯 !
註冊 或 登入 以發表評論。